#!/bin/bash

# ====================================================================
# 数智化团队考试系统 - Linux一体化脚本
# 功能：自动安装环境 + 自动安装依赖 + 一键启动
# Based on: xmky-exam (https://gitee.com/zhanghucheng/exam)
# License: GPL-2.0
# Modified: 2025-10-21
# ====================================================================

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
NC='\033[0m'

# 项目路径
PROJECT_ROOT="$(cd "$(dirname "$0")" && pwd)"
TOOLS_DIR="$PROJECT_ROOT/tools"
JDK_DIR="$TOOLS_DIR/jdk8"
MAVEN_DIR="$TOOLS_DIR/maven"

# 系统架构
ARCH=$(uname -m)
case "$ARCH" in
    x86_64|amd64) JDK_ARCH="x64" ;;
    aarch64|arm64) JDK_ARCH="aarch64" ;;
    *) echo -e "${RED}[错误]${NC} 不支持的系统架构: $ARCH"; exit 1 ;;
esac

# ============================================================
# 打印函数
# ============================================================
print_info() { echo -e "${GREEN}[信息]${NC} $1"; }
print_error() { echo -e "${RED}[错误]${NC} $1"; }
print_warning() { echo -e "${YELLOW}[警告]${NC} $1"; }
print_success() { echo -e "${GREEN}[✓]${NC} $1"; }
print_fail() { echo -e "${RED}[×]${NC} $1"; }

# ============================================================
# 主菜单
# ============================================================
main_menu() {
    clear
    echo "========================================"
    echo "  数智化团队考试系统 - 一体化管理"
    echo "========================================"
    echo ""
    echo "  1. 快速启动（自动检测并安装）"
    echo "  2. 仅安装环境和依赖"
    echo "  3. 仅启动后端服务"
    echo "  4. 启动前端H5开发服务器"
    echo "  5. 启动前端移动端开发服务器"
    echo "  6. 查看系统信息"
    echo "  7. 清理编译文件"
    echo "  0. 退出"
    echo ""
    echo "========================================"
    read -p "请选择操作 (0-7): " choice
    
    case "$choice" in
        1) quick_start ;;
        2) install_only ;;
        3) start_backend ;;
        4) start_h5 ;;
        5) start_mobile ;;
        6) show_info ;;
        7) clean_build ;;
        0) exit 0 ;;
        *) main_menu ;;
    esac
}

# ============================================================
# 快速启动
# ============================================================
quick_start() {
    clear
    echo "========================================"
    echo "  快速启动模式"
    echo "========================================"
    echo ""
    
    # 检查Java
    if ! check_java; then
        print_info "正在自动安装Java环境..."
        install_java || { error_exit; return; }
    fi
    
    # 检查Maven
    if ! check_maven; then
        print_info "正在自动安装Maven环境..."
        install_maven || { error_exit; return; }
    fi
    
    # 检查后端是否已编译
    if [ ! -f "src/sys-web/target/digital-team-exam-5.6.0.jar" ]; then
        echo ""
        print_info "后端未编译，开始编译..."
        build_backend || { error_exit; return; }
    fi
    
    # 启动后端
    echo ""
    echo "========================================"
    echo "  后端服务启动中..."
    echo "========================================"
    echo ""
    start_backend_service
}

# ============================================================
# 仅安装
# ============================================================
install_only() {
    clear
    echo "========================================"
    echo "  安装模式"
    echo "========================================"
    echo ""
    
    # 检查并安装Java
    if ! check_java; then
        install_java || { error_exit; return; }
    fi
    
    # 检查并安装Maven
    if ! check_maven; then
        install_maven || { error_exit; return; }
    fi
    
    # 编译后端
    echo ""
    build_backend || { error_exit; return; }
    
    # 检查Node.js并安装前端依赖
    if check_node; then
        install_frontend
    fi
    
    echo ""
    echo "========================================"
    echo "  安装完成！"
    echo "========================================"
    echo ""
    read -p "按回车键继续..."
    main_menu
}

# ============================================================
# 仅启动后端
# ============================================================
start_backend() {
    clear
    echo "========================================"
    echo "  启动后端服务"
    echo "========================================"
    echo ""
    
    if ! check_java; then
        print_error "未检测到Java环境，请先执行\"安装环境和依赖\""
        read -p "按回车键继续..."
        main_menu
        return
    fi
    
    if [ ! -f "src/sys-web/target/digital-team-exam-5.6.0.jar" ]; then
        print_error "后端未编译，请先执行\"安装环境和依赖\""
        read -p "按回车键继续..."
        main_menu
        return
    fi
    
    start_backend_service
}

# ============================================================
# 启动前端H5
# ============================================================
start_h5() {
    clear
    echo "========================================"
    echo "  启动前端H5开发服务器"
    echo "========================================"
    echo ""
    
    if [ ! -d "h5/node_modules" ]; then
        print_error "前端H5依赖未安装"
        print_info "请先执行: cd h5 然后 npm install"
        read -p "按回车键继续..."
        main_menu
        return
    fi
    
    cd h5 || return
    print_info "正在启动H5开发服务器..."
    print_info "默认端口: 5173"
    echo ""
    npm run dev
    cd ..
    read -p "按回车键继续..."
    main_menu
}

# ============================================================
# 启动前端移动端
# ============================================================
start_mobile() {
    clear
    echo "========================================"
    echo "  启动前端移动端开发服务器"
    echo "========================================"
    echo ""
    
    if [ ! -d "m/node_modules" ]; then
        print_error "前端移动端依赖未安装"
        print_info "请先执行: cd m 然后 npm install"
        read -p "按回车键继续..."
        main_menu
        return
    fi
    
    cd m || return
    print_info "正在启动移动端开发服务器..."
    echo ""
    npm run dev
    cd ..
    read -p "按回车键继续..."
    main_menu
}

# ============================================================
# 查看系统信息
# ============================================================
show_info() {
    clear
    echo "========================================"
    echo "  系统信息"
    echo "========================================"
    echo ""
    
    echo -e "${CYAN}[项目路径]${NC} $PROJECT_ROOT"
    echo ""
    
    echo -e "${CYAN}[Java环境]${NC}"
    if [ -f "$JDK_DIR/bin/java" ]; then
        echo "- 项目内置: $JDK_DIR"
        "$JDK_DIR/bin/java" -version 2>&1 | head -n 1
    elif command -v java &> /dev/null; then
        echo "- 系统环境"
        java -version 2>&1 | head -n 1
    else
        echo "- 未安装"
    fi
    echo ""
    
    echo -e "${CYAN}[Maven环境]${NC}"
    if [ -f "$MAVEN_DIR/bin/mvn" ]; then
        echo "- 项目内置: $MAVEN_DIR"
        "$MAVEN_DIR/bin/mvn" -version | head -n 1
    elif command -v mvn &> /dev/null; then
        echo "- 系统环境"
        mvn -version | head -n 1
    else
        echo "- 未安装"
    fi
    echo ""
    
    echo -e "${CYAN}[Node.js环境]${NC}"
    if command -v node &> /dev/null; then
        echo "- Node.js: $(node -v)"
        echo "- npm: $(npm -v)"
    else
        echo "- 未安装"
    fi
    echo ""
    
    echo -e "${CYAN}[后端状态]${NC}"
    if [ -f "src/sys-web/target/digital-team-exam-5.6.0.jar" ]; then
        echo "- 已编译: src/sys-web/target/digital-team-exam-5.6.0.jar"
    else
        echo "- 未编译"
    fi
    echo ""
    
    echo -e "${CYAN}[前端状态]${NC}"
    [ -d "h5/node_modules" ] && echo "- H5依赖: 已安装" || echo "- H5依赖: 未安装"
    [ -d "m/node_modules" ] && echo "- 移动端依赖: 已安装" || echo "- 移动端依赖: 未安装"
    echo ""
    
    read -p "按回车键继续..."
    main_menu
}

# ============================================================
# 清理编译文件
# ============================================================
clean_build() {
    clear
    echo "========================================"
    echo "  清理编译文件"
    echo "========================================"
    echo ""
    print_warning "这将删除所有编译产物"
    print_info "不会删除下载的环境（tools目录）"
    echo ""
    read -p "确认清理吗？(y/N): " confirm
    
    if [[ ! "$confirm" =~ ^[Yy]$ ]]; then
        main_menu
        return
    fi
    
    echo ""
    print_info "正在清理后端编译文件..."
    if [ -d "src" ]; then
        cd src || return
        mvn clean > /dev/null 2>&1
        cd ..
    fi
    
    print_success "清理完成"
    echo ""
    read -p "按回车键继续..."
    main_menu
}

# ============================================================
# 检查Java环境
# ============================================================
check_java() {
    if [ -f "$JDK_DIR/bin/java" ]; then
        export JAVA_HOME="$JDK_DIR"
        export PATH="$JDK_DIR/bin:$PATH"
        print_success "Java环境: 项目内置"
        return 0
    fi
    
    if command -v java &> /dev/null; then
        print_success "Java环境: 系统环境"
        return 0
    fi
    
    print_fail "Java环境: 未安装"
    return 1
}

# ============================================================
# 安装Java
# ============================================================
install_java() {
    echo ""
    print_info "[步骤] 安装Java环境到项目目录..."
    echo ""
    
    mkdir -p "$TOOLS_DIR"
    
    JDK_URL="https://mirrors.tuna.tsinghua.edu.cn/Adoptium/8/jdk/$JDK_ARCH/linux/OpenJDK8U-jdk_${JDK_ARCH}_linux_hotspot_8u422b05.tar.gz"
    JDK_TAR="$TOOLS_DIR/openjdk8.tar.gz"
    
    print_info "[下载] 正在下载 OpenJDK 8 (约100MB)..."
    print_info "[来源] 清华大学开源镜像站"
    echo ""
    
    if command -v wget &> /dev/null; then
        wget -O "$JDK_TAR" "$JDK_URL" || return 1
    elif command -v curl &> /dev/null; then
        curl -L -o "$JDK_TAR" "$JDK_URL" || return 1
    else
        print_error "未找到wget或curl"
        return 1
    fi
    
    print_info "[解压] 正在解压JDK..."
    mkdir -p "$JDK_DIR"
    tar -xzf "$JDK_TAR" -C "$TOOLS_DIR"
    
    for d in "$TOOLS_DIR"/jdk8*; do
        if [ -d "$d" ]; then
            mv "$d"/* "$JDK_DIR/" 2>/dev/null || true
            rmdir "$d" 2>/dev/null || true
        fi
    done
    
    rm -f "$JDK_TAR"
    
    if [ -f "$JDK_DIR/bin/java" ]; then
        export JAVA_HOME="$JDK_DIR"
        export PATH="$JDK_DIR/bin:$PATH"
        print_success "Java安装完成"
        return 0
    fi
    
    print_fail "Java安装失败"
    return 1
}

# ============================================================
# 检查Maven环境
# ============================================================
check_maven() {
    if [ -f "$MAVEN_DIR/bin/mvn" ]; then
        export M2_HOME="$MAVEN_DIR"
        export PATH="$MAVEN_DIR/bin:$PATH"
        print_success "Maven环境: 项目内置"
        return 0
    fi
    
    if command -v mvn &> /dev/null; then
        print_success "Maven环境: 系统环境"
        return 0
    fi
    
    print_fail "Maven环境: 未安装"
    return 1
}

# ============================================================
# 安装Maven
# ============================================================
install_maven() {
    echo ""
    print_info "[步骤] 安装Maven环境到项目目录..."
    echo ""
    
    mkdir -p "$TOOLS_DIR"
    
    MVN_URL="https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.9.9/binaries/apache-maven-3.9.9-bin.tar.gz"
    MVN_TAR="$TOOLS_DIR/maven.tar.gz"
    
    print_info "[下载] 正在下载 Apache Maven 3.9.9 (约10MB)..."
    echo ""
    
    if command -v wget &> /dev/null; then
        wget -O "$MVN_TAR" "$MVN_URL" || return 1
    elif command -v curl &> /dev/null; then
        curl -L -o "$MVN_TAR" "$MVN_URL" || return 1
    fi
    
    print_info "[解压] 正在解压Maven..."
    tar -xzf "$MVN_TAR" -C "$TOOLS_DIR"
    
    for d in "$TOOLS_DIR"/apache-maven-*; do
        if [ -d "$d" ]; then
            mv "$d" "$MAVEN_DIR"
            break
        fi
    done
    
    rm -f "$MVN_TAR"
    
    if [ -f "$MAVEN_DIR/bin/mvn" ]; then
        export M2_HOME="$MAVEN_DIR"
        export PATH="$MAVEN_DIR/bin:$PATH"
        print_success "Maven安装完成"
        return 0
    fi
    
    print_fail "Maven安装失败"
    return 1
}

# ============================================================
# 检查Node.js
# ============================================================
check_node() {
    if command -v node &> /dev/null; then
        print_success "Node.js环境: 已安装"
        return 0
    fi
    print_fail "Node.js环境: 未安装（可选）"
    return 1
}

# ============================================================
# 编译后端
# ============================================================
build_backend() {
    echo ""
    print_info "[编译] 正在编译后端项目..."
    echo ""
    
    if [ ! -d "src" ]; then
        print_error "未找到src目录"
        return 1
    fi
    
    cd src || return 1
    print_info "[执行] mvn clean package -DskipTests"
    echo ""
    mvn clean package -DskipTests
    
    if [ $? -ne 0 ]; then
        echo ""
        print_error "后端编译失败"
        cd ..
        return 1
    fi
    
    cd ..
    echo ""
    print_success "后端编译完成"
    return 0
}

# ============================================================
# 安装前端依赖
# ============================================================
install_frontend() {
    echo ""
    print_info "[前端] 正在安装前端依赖..."
    echo ""
    
    if [ -f "h5/package.json" ]; then
        print_info "[H5] 安装依赖中..."
        cd h5 && npm install && cd ..
    fi
    
    if [ -f "m/package.json" ]; then
        print_info "[移动端] 安装依赖中..."
        cd m && npm install && cd ..
    fi
    
    print_success "前端依赖安装完成"
    return 0
}

# ============================================================
# 启动后端服务
# ============================================================
start_backend_service() {
    cd src/sys-web/target || return 1
    
    echo -e "${CYAN}[服务]${NC} 数智化团队考试系统"
    echo -e "${CYAN}[端口]${NC} 8000"
    echo -e "${CYAN}[账号]${NC} admin / 111111"
    echo -e "${CYAN}[说明]${NC} 按 Ctrl+C 停止服务"
    echo ""
    echo "========================================"
    echo ""
    
    java -jar digital-team-exam-5.6.0.jar
    cd ../../..
}

# ============================================================
# 错误退出
# ============================================================
error_exit() {
    echo ""
    print_error "操作失败，请检查错误信息"
    read -p "按回车键继续..."
    main_menu
}

# ============================================================
# 主程序入口
# ============================================================
main_menu

